package circlesinglink

import "fmt"

type CatNode struct {
	no   int
	name string
	next *CatNode
}

func (head *CatNode) InsertCatNode(newCatNode *CatNode) {
	//判断是不是添加第一只猫
	if head.next == nil {
		head.no = newCatNode.no
		head.name = newCatNode.name
		head.next = head //构成一个环形
		return
	}
	//定义一个临时变量，帮忙，找到最后的结点
	temp := head
	for {
		if temp.next == head {
			break
		}
		temp = temp.next
	}
	//加入到链表中
	temp.next = newCatNode
	newCatNode.next = head
}

// 显示这个环形的链表
func (head *CatNode) ListCircleLink() {
	fmt.Println("环形链表情况如下")
	temp := head
	if temp.next == nil {
		fmt.Println("空空如也")
		return
	}
	for {
		fmt.Println(temp.no, temp.name)
		if temp.next == head {
			break
		}
		temp = temp.next
	}
}

// 删除一只猫
func (head *CatNode) DelCircleLink(id int) *CatNode {
	//怎么删除了，。反正是搞烦我了，怎么说呢，把所有的细节写在下面
	pre := head
	cur := head.next
	if head.no == id { //这里是第一个头节点如果等于这个需要删除的时候
		if head.next == head { //我们先判断是否只有这一个
			return nil //如果是的话，我们返回nil
		}
		temp := head //如果不是我们就要判断一下这个环形链表最后一个
		for {
			if temp.next == head { //在这里我们找到了
				break
			}
			temp = temp.next
		}
		temp.next = head.next //我们让最后一个的下一个指向第一个的下一个，这里一定要注意
		return temp.next      //接着就是返沪会这个时候的头节点
	}
	//从这里开始判断的后面的是不是
	for cur.next != head { //如果找到最后一个，但是这个时候，我们还没有判断最后一个
		if cur.no == id { //找到了，就直接进行退出，和移动
			pre.next = cur.next
			return head
		}
		//对两个指针进行移动
		pre = cur
		cur = cur.next
	}
	if cur.no == id { //进行最后一个的判断，如果是就进行移动
		pre.next = cur.next
		return head
	}
	return head
}

func Testmain() {
	//这里我们初始化一个环形链表的头节点
	head := &CatNode{}
	//创建一直猫
	cat1 := &CatNode{
		no:   1,
		name: "Tom",
	}
	cat2 := &CatNode{
		no:   2,
		name: "Jack",
	}
	cat3 := &CatNode{
		no:   3,
		name: "Marry",
	}
	head.InsertCatNode(cat1)
	head.InsertCatNode(cat2)
	head.InsertCatNode(cat3)
	head.ListCircleLink()
	head = head.DelCircleLink(1)
	head.ListCircleLink()
}
